{
 "cells": [
  {
   "cell_type": "markdown",
   "source": [
    "# snnTorch Test - Truncated BPTT\n",
    "### By Jason K. Eshraghian"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "## Gradient-based Learning in Spiking Neural Networks"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Looking in indexes: https://test.pypi.org/simple/\n",
      "Requirement already satisfied: snntorch in c:\\users\\jason\\dropbox\\repos\\snntorch (0.0.7)\n"
     ]
    }
   ],
   "source": [
    "# Install the test PyPi Distribution of snntorch\n",
    "!pip install -i https://test.pypi.org/simple/ snntorch"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "## 1. Setting up the Static MNIST Dataset\n",
    "### 1.1. Import packages and setup environment"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "outputs": [],
   "source": [
    "import snntorch as snn\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "from torch.utils.data import DataLoader\n",
    "from torchvision import datasets, transforms\n",
    "import numpy as np\n",
    "import itertools\n",
    "import matplotlib.pyplot as plt"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "### 1.2 Define network and SNN parameters"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "outputs": [],
   "source": [
    "# Network Architecture\n",
    "num_inputs = 28*28\n",
    "num_hidden = 1000\n",
    "num_outputs = 10\n",
    "\n",
    "# Training Parameters\n",
    "batch_size=128\n",
    "data_path='/data/mnist'\n",
    "\n",
    "# Temporal Dynamics\n",
    "num_steps = 25\n",
    "time_step = 1e-3\n",
    "tau_mem = 3e-3\n",
    "tau_syn = 2.2e-3\n",
    "alpha = float(np.exp(-time_step/tau_syn))\n",
    "beta = float(np.exp(-time_step/tau_mem))\n",
    "\n",
    "dtype = torch.float\n",
    "device = torch.device(\"cuda\") if torch.cuda.is_available() else torch.device(\"cpu\")"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "### 1.3 Download MNIST Dataset"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "outputs": [],
   "source": [
    "# Define a transform\n",
    "transform = transforms.Compose([\n",
    "            transforms.Resize((28, 28)),\n",
    "            transforms.Grayscale(),\n",
    "            transforms.ToTensor(),\n",
    "            transforms.Normalize((0,), (1,))])\n",
    "\n",
    "mnist_train = datasets.MNIST(data_path, train=True, download=True, transform=transform)\n",
    "mnist_test = datasets.MNIST(data_path, train=False, download=True, transform=transform)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "### 1.4 Create DataLoaders"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "outputs": [],
   "source": [
    "train_loader = DataLoader(mnist_train, batch_size=batch_size, shuffle=True, drop_last=True)\n",
    "test_loader = DataLoader(mnist_test, batch_size=batch_size, shuffle=True, drop_last=True)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "## 2. Define Network\n",
    "snnTorch treats neurons as activations with recurrent connections. This allows for smooth integration with PyTorch.\n",
    "There are a few useful neuron models and surrogate gradient functions which approximate the gradient of spikes."
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "outputs": [],
   "source": [
    "# from snntorch import surrogate\n",
    "#\n",
    "# spike_grad = surrogate.FastSigmoid.apply\n",
    "# snn.slope = 50"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "The following network model no longer has a for-loop. That is performed in the feedforward pass along with optimization at each time step."
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "outputs": [],
   "source": [
    "# Define Network\n",
    "class Net(nn.Module):\n",
    "    def __init__(self):\n",
    "        super().__init__()\n",
    "\n",
    "    # initialize layers\n",
    "        self.fc1 = nn.Linear(num_inputs, num_hidden)\n",
    "        self.lif1 = snn.Stein(alpha=alpha, beta=beta)\n",
    "        self.fc2 = nn.Linear(num_hidden, num_outputs)\n",
    "        self.lif2 = snn.Stein(alpha=alpha, beta=beta)\n",
    "\n",
    "    def forward(self, x, syn1, mem1, spk1, syn2, mem2):\n",
    "        cur1 = self.fc1(x)\n",
    "        spk1, syn1, mem1 = self.lif1(cur1, syn1, mem1)\n",
    "        cur2 = self.fc2(spk1)\n",
    "        spk2, syn2, mem2 = self.lif2(cur2, syn2, mem2)\n",
    "        return syn1, mem1, spk1, syn2, mem2, spk2\n",
    "\n",
    "net = Net().to(device)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "## 3. Training\n",
    "Time for training! Let's first define a couple of functions to print out test/train accuracy."
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "outputs": [],
   "source": [
    "def print_batch_accuracy(data, targets, syn1, mem1, spk1, syn2, mem2, train=False):\n",
    "  spk2_rec = []\n",
    "  for step in range(num_steps):\n",
    "    syn1, mem1, spk1, syn2, mem2, spk2 = net(data.view(batch_size, -1), syn1, mem1, spk1, syn2, mem2)\n",
    "    spk2_rec.append(spk2)\n",
    "  spk2_rec = torch.stack(spk2_rec, dim=0)\n",
    "  _, idx = spk2_rec.sum(dim=0).max(1)\n",
    "  acc = np.mean((targets == idx).detach().cpu().numpy())\n",
    "\n",
    "  if train:\n",
    "      print(f\"Train Set Accuracy: {acc}\")\n",
    "  else:\n",
    "      print(f\"Test Set Accuracy: {acc}\")\n",
    "\n",
    "def train_printer(syn1, mem1, spk1, syn2, mem2, test_syn1, test_mem1, test_spk1, test_syn2, test_mem2):\n",
    "    print(f\"Epoch {epoch}, Minibatch {minibatch_counter}\")\n",
    "    print(f\"Train Set Loss: {loss_hist[counter]}\")\n",
    "    print(f\"Test Set Loss: {test_loss_hist[counter]}\")\n",
    "    print_batch_accuracy(data_it, targets_it, syn1, mem1, spk1, syn2, mem2, train=True)\n",
    "    print_batch_accuracy(testdata_it, testtargets_it, test_syn1, test_mem1, test_spk1, test_syn2, test_mem2, train=False)\n",
    "    print(\"\\n\")\n"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "### 3.1 Training Loop"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 0, Minibatch 0\n",
      "Train Set Loss: 1.7495200634002686\n",
      "Test Set Loss: 1.9518725872039795\n",
      "Train Set Accuracy: 0.4375\n",
      "Test Set Accuracy: 0.3515625\n",
      "\n",
      "\n",
      "Epoch 0, Minibatch 1\n",
      "Train Set Loss: 1.3979709148406982\n",
      "Test Set Loss: 1.5701136589050293\n",
      "Train Set Accuracy: 0.625\n",
      "Test Set Accuracy: 0.5234375\n",
      "\n",
      "\n",
      "Epoch 0, Minibatch 2\n",
      "Train Set Loss: 1.026261568069458\n",
      "Test Set Loss: 1.1336437463760376\n",
      "Train Set Accuracy: 0.78125\n",
      "Test Set Accuracy: 0.703125\n",
      "\n",
      "\n",
      "Epoch 0, Minibatch 3\n",
      "Train Set Loss: 0.9658181667327881\n",
      "Test Set Loss: 1.1051888465881348\n",
      "Train Set Accuracy: 0.8046875\n",
      "Test Set Accuracy: 0.6640625\n",
      "\n",
      "\n",
      "Epoch 0, Minibatch 4\n",
      "Train Set Loss: 0.7896397709846497\n",
      "Test Set Loss: 0.905153751373291\n",
      "Train Set Accuracy: 0.796875\n",
      "Test Set Accuracy: 0.71875\n",
      "\n",
      "\n",
      "Epoch 0, Minibatch 5\n",
      "Train Set Loss: 0.6378481984138489\n",
      "Test Set Loss: 0.9468184113502502\n",
      "Train Set Accuracy: 0.875\n",
      "Test Set Accuracy: 0.734375\n",
      "\n",
      "\n",
      "Epoch 0, Minibatch 6\n",
      "Train Set Loss: 0.746235191822052\n",
      "Test Set Loss: 0.9170961976051331\n",
      "Train Set Accuracy: 0.8203125\n",
      "Test Set Accuracy: 0.78125\n",
      "\n",
      "\n",
      "Epoch 0, Minibatch 7\n",
      "Train Set Loss: 0.7137413024902344\n",
      "Test Set Loss: 0.8111165761947632\n",
      "Train Set Accuracy: 0.890625\n",
      "Test Set Accuracy: 0.765625\n",
      "\n",
      "\n",
      "Epoch 0, Minibatch 8\n",
      "Train Set Loss: 0.47396788001060486\n",
      "Test Set Loss: 0.7326197624206543\n",
      "Train Set Accuracy: 0.90625\n",
      "Test Set Accuracy: 0.75\n",
      "\n",
      "\n",
      "Epoch 0, Minibatch 9\n",
      "Train Set Loss: 0.7309470176696777\n",
      "Test Set Loss: 0.6419931650161743\n",
      "Train Set Accuracy: 0.8203125\n",
      "Test Set Accuracy: 0.8828125\n",
      "\n",
      "\n",
      "Epoch 0, Minibatch 10\n",
      "Train Set Loss: 0.4580203890800476\n",
      "Test Set Loss: 0.5942947864532471\n",
      "Train Set Accuracy: 0.9296875\n",
      "Test Set Accuracy: 0.796875\n",
      "\n",
      "\n",
      "Epoch 0, Minibatch 11\n",
      "Train Set Loss: 0.5444415807723999\n",
      "Test Set Loss: 0.624632716178894\n",
      "Train Set Accuracy: 0.8828125\n",
      "Test Set Accuracy: 0.75\n",
      "\n",
      "\n",
      "Epoch 0, Minibatch 12\n",
      "Train Set Loss: 0.52439945936203\n",
      "Test Set Loss: 0.4426622986793518\n",
      "Train Set Accuracy: 0.890625\n",
      "Test Set Accuracy: 0.8671875\n",
      "\n",
      "\n",
      "Epoch 0, Minibatch 13\n",
      "Train Set Loss: 0.4285009205341339\n",
      "Test Set Loss: 0.467987596988678\n",
      "Train Set Accuracy: 0.875\n",
      "Test Set Accuracy: 0.875\n",
      "\n",
      "\n",
      "Epoch 0, Minibatch 14\n",
      "Train Set Loss: 0.5765503644943237\n",
      "Test Set Loss: 0.5667204260826111\n",
      "Train Set Accuracy: 0.8671875\n",
      "Test Set Accuracy: 0.8515625\n",
      "\n",
      "\n",
      "Epoch 0, Minibatch 15\n",
      "Train Set Loss: 0.4504099488258362\n",
      "Test Set Loss: 0.46107131242752075\n",
      "Train Set Accuracy: 0.90625\n",
      "Test Set Accuracy: 0.8828125\n",
      "\n",
      "\n",
      "Epoch 0, Minibatch 16\n",
      "Train Set Loss: 0.4541475772857666\n",
      "Test Set Loss: 0.4454127252101898\n",
      "Train Set Accuracy: 0.875\n",
      "Test Set Accuracy: 0.8828125\n",
      "\n",
      "\n",
      "Epoch 0, Minibatch 17\n",
      "Train Set Loss: 0.47475460171699524\n",
      "Test Set Loss: 0.5214759707450867\n",
      "Train Set Accuracy: 0.8515625\n",
      "Test Set Accuracy: 0.8515625\n",
      "\n",
      "\n",
      "Epoch 0, Minibatch 18\n",
      "Train Set Loss: 0.41250237822532654\n",
      "Test Set Loss: 0.4996296167373657\n",
      "Train Set Accuracy: 0.8984375\n",
      "Test Set Accuracy: 0.8515625\n",
      "\n",
      "\n",
      "Epoch 0, Minibatch 19\n",
      "Train Set Loss: 0.40151408314704895\n",
      "Test Set Loss: 0.4587456285953522\n",
      "Train Set Accuracy: 0.875\n",
      "Test Set Accuracy: 0.8984375\n",
      "\n",
      "\n",
      "Epoch 0, Minibatch 20\n",
      "Train Set Loss: 0.27906960248947144\n",
      "Test Set Loss: 0.5087960362434387\n",
      "Train Set Accuracy: 0.9453125\n",
      "Test Set Accuracy: 0.859375\n",
      "\n",
      "\n",
      "Epoch 0, Minibatch 21\n",
      "Train Set Loss: 0.6448639035224915\n",
      "Test Set Loss: 0.3771025836467743\n",
      "Train Set Accuracy: 0.875\n",
      "Test Set Accuracy: 0.875\n",
      "\n",
      "\n",
      "Epoch 0, Minibatch 22\n",
      "Train Set Loss: 0.42335885763168335\n",
      "Test Set Loss: 0.6078567504882812\n",
      "Train Set Accuracy: 0.9140625\n",
      "Test Set Accuracy: 0.8671875\n",
      "\n",
      "\n",
      "Epoch 0, Minibatch 23\n",
      "Train Set Loss: 0.3247307240962982\n",
      "Test Set Loss: 0.4790240526199341\n",
      "Train Set Accuracy: 0.921875\n",
      "Test Set Accuracy: 0.84375\n",
      "\n",
      "\n",
      "Epoch 0, Minibatch 24\n",
      "Train Set Loss: 0.47793853282928467\n",
      "Test Set Loss: 0.5908436179161072\n",
      "Train Set Accuracy: 0.8828125\n",
      "Test Set Accuracy: 0.8671875\n",
      "\n",
      "\n",
      "Epoch 0, Minibatch 25\n",
      "Train Set Loss: 0.3392049968242645\n",
      "Test Set Loss: 0.48888471722602844\n"
     ]
    },
    {
     "ename": "KeyboardInterrupt",
     "evalue": "",
     "output_type": "error",
     "traceback": [
      "\u001B[1;31m---------------------------------------------------------------------------\u001B[0m",
      "\u001B[1;31mKeyboardInterrupt\u001B[0m                         Traceback (most recent call last)",
      "\u001B[1;32m<ipython-input-9-d105e765f64e>\u001B[0m in \u001B[0;36m<module>\u001B[1;34m\u001B[0m\n\u001B[0;32m     68\u001B[0m             \u001B[1;31m# Print test/train loss/accuracy\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m     69\u001B[0m             \u001B[1;32mif\u001B[0m \u001B[0mstep_counter\u001B[0m \u001B[1;33m==\u001B[0m \u001B[1;36m24\u001B[0m\u001B[1;33m:\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[1;32m---> 70\u001B[1;33m                 \u001B[0mtrain_printer\u001B[0m\u001B[1;33m(\u001B[0m\u001B[0msyn1\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mmem1\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mspk1\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0msyn2\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mmem2\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mtest_syn1\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mtest_mem1\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mtest_spk1\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mtest_syn2\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mtest_mem2\u001B[0m\u001B[1;33m)\u001B[0m \u001B[1;31m## THIS IS A JOKE\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0m\u001B[0;32m     71\u001B[0m             \u001B[0mstep_counter\u001B[0m \u001B[1;33m+=\u001B[0m \u001B[1;36m1\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m     72\u001B[0m             \u001B[0mcounter\u001B[0m \u001B[1;33m+=\u001B[0m\u001B[1;36m1\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n",
      "\u001B[1;32m<ipython-input-8-7af3a7c6471e>\u001B[0m in \u001B[0;36mtrain_printer\u001B[1;34m(syn1, mem1, spk1, syn2, mem2, test_syn1, test_mem1, test_spk1, test_syn2, test_mem2)\u001B[0m\n\u001B[0;32m     17\u001B[0m     \u001B[0mprint\u001B[0m\u001B[1;33m(\u001B[0m\u001B[1;34mf\"Train Set Loss: {loss_hist[counter]}\"\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m     18\u001B[0m     \u001B[0mprint\u001B[0m\u001B[1;33m(\u001B[0m\u001B[1;34mf\"Test Set Loss: {test_loss_hist[counter]}\"\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[1;32m---> 19\u001B[1;33m     \u001B[0mprint_batch_accuracy\u001B[0m\u001B[1;33m(\u001B[0m\u001B[0mdata_it\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mtargets_it\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0msyn1\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mmem1\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mspk1\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0msyn2\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mmem2\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mtrain\u001B[0m\u001B[1;33m=\u001B[0m\u001B[1;32mTrue\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0m\u001B[0;32m     20\u001B[0m     \u001B[0mprint_batch_accuracy\u001B[0m\u001B[1;33m(\u001B[0m\u001B[0mtestdata_it\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mtesttargets_it\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mtest_syn1\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mtest_mem1\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mtest_spk1\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mtest_syn2\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mtest_mem2\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mtrain\u001B[0m\u001B[1;33m=\u001B[0m\u001B[1;32mFalse\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m     21\u001B[0m     \u001B[0mprint\u001B[0m\u001B[1;33m(\u001B[0m\u001B[1;34m\"\\n\"\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n",
      "\u001B[1;32m<ipython-input-8-7af3a7c6471e>\u001B[0m in \u001B[0;36mprint_batch_accuracy\u001B[1;34m(data, targets, syn1, mem1, spk1, syn2, mem2, train)\u001B[0m\n\u001B[0;32m      2\u001B[0m   \u001B[0mspk2_rec\u001B[0m \u001B[1;33m=\u001B[0m \u001B[1;33m[\u001B[0m\u001B[1;33m]\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m      3\u001B[0m   \u001B[1;32mfor\u001B[0m \u001B[0mstep\u001B[0m \u001B[1;32min\u001B[0m \u001B[0mrange\u001B[0m\u001B[1;33m(\u001B[0m\u001B[0mnum_steps\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m:\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[1;32m----> 4\u001B[1;33m     \u001B[0msyn1\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mmem1\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mspk1\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0msyn2\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mmem2\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mspk2\u001B[0m \u001B[1;33m=\u001B[0m \u001B[0mnet\u001B[0m\u001B[1;33m(\u001B[0m\u001B[0mdata\u001B[0m\u001B[1;33m.\u001B[0m\u001B[0mview\u001B[0m\u001B[1;33m(\u001B[0m\u001B[0mbatch_size\u001B[0m\u001B[1;33m,\u001B[0m \u001B[1;33m-\u001B[0m\u001B[1;36m1\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0msyn1\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mmem1\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mspk1\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0msyn2\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mmem2\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0m\u001B[0;32m      5\u001B[0m     \u001B[0mspk2_rec\u001B[0m\u001B[1;33m.\u001B[0m\u001B[0mappend\u001B[0m\u001B[1;33m(\u001B[0m\u001B[0mspk2\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m      6\u001B[0m   \u001B[0mspk2_rec\u001B[0m \u001B[1;33m=\u001B[0m \u001B[0mtorch\u001B[0m\u001B[1;33m.\u001B[0m\u001B[0mstack\u001B[0m\u001B[1;33m(\u001B[0m\u001B[0mspk2_rec\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mdim\u001B[0m\u001B[1;33m=\u001B[0m\u001B[1;36m0\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n",
      "\u001B[1;32m~\\anaconda3\\envs\\py367\\lib\\site-packages\\torch\\nn\\modules\\module.py\u001B[0m in \u001B[0;36m_call_impl\u001B[1;34m(self, *input, **kwargs)\u001B[0m\n\u001B[0;32m    720\u001B[0m             \u001B[0mresult\u001B[0m \u001B[1;33m=\u001B[0m \u001B[0mself\u001B[0m\u001B[1;33m.\u001B[0m\u001B[0m_slow_forward\u001B[0m\u001B[1;33m(\u001B[0m\u001B[1;33m*\u001B[0m\u001B[0minput\u001B[0m\u001B[1;33m,\u001B[0m \u001B[1;33m**\u001B[0m\u001B[0mkwargs\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m    721\u001B[0m         \u001B[1;32melse\u001B[0m\u001B[1;33m:\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[1;32m--> 722\u001B[1;33m             \u001B[0mresult\u001B[0m \u001B[1;33m=\u001B[0m \u001B[0mself\u001B[0m\u001B[1;33m.\u001B[0m\u001B[0mforward\u001B[0m\u001B[1;33m(\u001B[0m\u001B[1;33m*\u001B[0m\u001B[0minput\u001B[0m\u001B[1;33m,\u001B[0m \u001B[1;33m**\u001B[0m\u001B[0mkwargs\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0m\u001B[0;32m    723\u001B[0m         for hook in itertools.chain(\n\u001B[0;32m    724\u001B[0m                 \u001B[0m_global_forward_hooks\u001B[0m\u001B[1;33m.\u001B[0m\u001B[0mvalues\u001B[0m\u001B[1;33m(\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m,\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n",
      "\u001B[1;32m<ipython-input-7-a98ba4a56cf8>\u001B[0m in \u001B[0;36mforward\u001B[1;34m(self, x, syn1, mem1, spk1, syn2, mem2)\u001B[0m\n\u001B[0;32m     12\u001B[0m     \u001B[1;32mdef\u001B[0m \u001B[0mforward\u001B[0m\u001B[1;33m(\u001B[0m\u001B[0mself\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mx\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0msyn1\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mmem1\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mspk1\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0msyn2\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mmem2\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m:\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m     13\u001B[0m         \u001B[0mcur1\u001B[0m \u001B[1;33m=\u001B[0m \u001B[0mself\u001B[0m\u001B[1;33m.\u001B[0m\u001B[0mfc1\u001B[0m\u001B[1;33m(\u001B[0m\u001B[0mx\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[1;32m---> 14\u001B[1;33m         \u001B[0mspk1\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0msyn1\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mmem1\u001B[0m \u001B[1;33m=\u001B[0m \u001B[0mself\u001B[0m\u001B[1;33m.\u001B[0m\u001B[0mlif1\u001B[0m\u001B[1;33m(\u001B[0m\u001B[0mcur1\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0msyn1\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mmem1\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0m\u001B[0;32m     15\u001B[0m         \u001B[0mcur2\u001B[0m \u001B[1;33m=\u001B[0m \u001B[0mself\u001B[0m\u001B[1;33m.\u001B[0m\u001B[0mfc2\u001B[0m\u001B[1;33m(\u001B[0m\u001B[0mspk1\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m     16\u001B[0m         \u001B[0mspk2\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0msyn2\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mmem2\u001B[0m \u001B[1;33m=\u001B[0m \u001B[0mself\u001B[0m\u001B[1;33m.\u001B[0m\u001B[0mlif2\u001B[0m\u001B[1;33m(\u001B[0m\u001B[0mcur2\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0msyn2\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mmem2\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n",
      "\u001B[1;32m~\\anaconda3\\envs\\py367\\lib\\site-packages\\torch\\nn\\modules\\module.py\u001B[0m in \u001B[0;36m_call_impl\u001B[1;34m(self, *input, **kwargs)\u001B[0m\n\u001B[0;32m    720\u001B[0m             \u001B[0mresult\u001B[0m \u001B[1;33m=\u001B[0m \u001B[0mself\u001B[0m\u001B[1;33m.\u001B[0m\u001B[0m_slow_forward\u001B[0m\u001B[1;33m(\u001B[0m\u001B[1;33m*\u001B[0m\u001B[0minput\u001B[0m\u001B[1;33m,\u001B[0m \u001B[1;33m**\u001B[0m\u001B[0mkwargs\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m    721\u001B[0m         \u001B[1;32melse\u001B[0m\u001B[1;33m:\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[1;32m--> 722\u001B[1;33m             \u001B[0mresult\u001B[0m \u001B[1;33m=\u001B[0m \u001B[0mself\u001B[0m\u001B[1;33m.\u001B[0m\u001B[0mforward\u001B[0m\u001B[1;33m(\u001B[0m\u001B[1;33m*\u001B[0m\u001B[0minput\u001B[0m\u001B[1;33m,\u001B[0m \u001B[1;33m**\u001B[0m\u001B[0mkwargs\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0m\u001B[0;32m    723\u001B[0m         for hook in itertools.chain(\n\u001B[0;32m    724\u001B[0m                 \u001B[0m_global_forward_hooks\u001B[0m\u001B[1;33m.\u001B[0m\u001B[0mvalues\u001B[0m\u001B[1;33m(\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m,\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n",
      "\u001B[1;32m~\\Dropbox\\repos\\snntorch\\snntorch\\__init__.py\u001B[0m in \u001B[0;36mforward\u001B[1;34m(self, input_, syn, mem)\u001B[0m\n\u001B[0;32m    133\u001B[0m     \u001B[1;32mdef\u001B[0m \u001B[0mforward\u001B[0m\u001B[1;33m(\u001B[0m\u001B[0mself\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0minput_\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0msyn\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mmem\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m:\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m    134\u001B[0m         \u001B[1;32mif\u001B[0m \u001B[1;32mnot\u001B[0m \u001B[0mself\u001B[0m\u001B[1;33m.\u001B[0m\u001B[0mhidden_init\u001B[0m\u001B[1;33m:\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[1;32m--> 135\u001B[1;33m             \u001B[0mspk\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mreset\u001B[0m \u001B[1;33m=\u001B[0m \u001B[0mself\u001B[0m\u001B[1;33m.\u001B[0m\u001B[0mfire\u001B[0m\u001B[1;33m(\u001B[0m\u001B[0mmem\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0m\u001B[0;32m    136\u001B[0m             \u001B[0msyn\u001B[0m \u001B[1;33m=\u001B[0m \u001B[0mself\u001B[0m\u001B[1;33m.\u001B[0m\u001B[0malpha\u001B[0m \u001B[1;33m*\u001B[0m \u001B[0msyn\u001B[0m \u001B[1;33m+\u001B[0m \u001B[0minput_\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m    137\u001B[0m             \u001B[0mmem\u001B[0m \u001B[1;33m=\u001B[0m \u001B[0mself\u001B[0m\u001B[1;33m.\u001B[0m\u001B[0mbeta\u001B[0m \u001B[1;33m*\u001B[0m \u001B[0mmem\u001B[0m \u001B[1;33m+\u001B[0m \u001B[0msyn\u001B[0m \u001B[1;33m-\u001B[0m \u001B[0mreset\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n",
      "\u001B[1;32m~\\Dropbox\\repos\\snntorch\\snntorch\\__init__.py\u001B[0m in \u001B[0;36mfire\u001B[1;34m(self, mem)\u001B[0m\n\u001B[0;32m     30\u001B[0m         Returns spk and reset.\"\"\"\n\u001B[0;32m     31\u001B[0m         \u001B[0mmem_shift\u001B[0m \u001B[1;33m=\u001B[0m \u001B[0mmem\u001B[0m \u001B[1;33m-\u001B[0m \u001B[0mself\u001B[0m\u001B[1;33m.\u001B[0m\u001B[0mthreshold\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[1;32m---> 32\u001B[1;33m         \u001B[0mspk\u001B[0m \u001B[1;33m=\u001B[0m \u001B[0mself\u001B[0m\u001B[1;33m.\u001B[0m\u001B[0mspike_grad\u001B[0m\u001B[1;33m(\u001B[0m\u001B[0mmem_shift\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m.\u001B[0m\u001B[0mto\u001B[0m\u001B[1;33m(\u001B[0m\u001B[0mdevice\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0m\u001B[0;32m     33\u001B[0m         \u001B[0mreset\u001B[0m \u001B[1;33m=\u001B[0m \u001B[0mtorch\u001B[0m\u001B[1;33m.\u001B[0m\u001B[0mzeros_like\u001B[0m\u001B[1;33m(\u001B[0m\u001B[0mmem\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m     34\u001B[0m         \u001B[0mspk_idx\u001B[0m \u001B[1;33m=\u001B[0m \u001B[1;33m(\u001B[0m\u001B[0mmem_shift\u001B[0m \u001B[1;33m>\u001B[0m \u001B[1;36m0\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n",
      "\u001B[1;32m~\\Dropbox\\repos\\snntorch\\snntorch\\__init__.py\u001B[0m in \u001B[0;36mforward\u001B[1;34m(ctx, input_)\u001B[0m\n\u001B[0;32m     88\u001B[0m             \u001B[0mctx\u001B[0m\u001B[1;33m.\u001B[0m\u001B[0msave_for_backward\u001B[0m\u001B[1;33m(\u001B[0m\u001B[0minput_\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m     89\u001B[0m             \u001B[0mout\u001B[0m \u001B[1;33m=\u001B[0m \u001B[0mtorch\u001B[0m\u001B[1;33m.\u001B[0m\u001B[0mzeros_like\u001B[0m\u001B[1;33m(\u001B[0m\u001B[0minput_\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[1;32m---> 90\u001B[1;33m             \u001B[0mout\u001B[0m\u001B[1;33m[\u001B[0m\u001B[0minput_\u001B[0m \u001B[1;33m>\u001B[0m \u001B[1;36m0\u001B[0m\u001B[1;33m]\u001B[0m \u001B[1;33m=\u001B[0m \u001B[1;36m1.0\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0m\u001B[0;32m     91\u001B[0m             \u001B[1;32mreturn\u001B[0m \u001B[0mout\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m     92\u001B[0m \u001B[1;33m\u001B[0m\u001B[0m\n",
      "\u001B[1;31mKeyboardInterrupt\u001B[0m: "
     ]
    }
   ],
   "source": [
    "optimizer = torch.optim.Adam(net.parameters(), lr=2e-4, betas=(0.9, 0.999))\n",
    "log_softmax_fn = nn.LogSoftmax(dim=-1)\n",
    "loss_fn = nn.NLLLoss()\n",
    "\n",
    "test_data = itertools.cycle(test_loader)\n",
    "\n",
    "loss_hist = []\n",
    "test_loss_hist = []\n",
    "counter = 0\n",
    "\n",
    "# Outer training loop\n",
    "for epoch in range(5):\n",
    "    train_batch = iter(train_loader)\n",
    "\n",
    "    # Minibatch training loop\n",
    "    minibatch_counter = 0\n",
    "    for data_it, targets_it in train_batch:\n",
    "        data_it = data_it.to(device)\n",
    "        targets_it = targets_it.to(device)\n",
    "\n",
    "        # Test set iterator\n",
    "        testdata_it, testtargets_it = next(test_data)\n",
    "        testdata_it = testdata_it.to(device)\n",
    "        testtargets_it = testtargets_it.to(device)\n",
    "\n",
    "        # initialization\n",
    "        spk1, syn1, mem1 = net.lif1.init_stein(batch_size, num_hidden)\n",
    "        spk2, syn2, mem2 = net.lif2.init_stein(batch_size, num_outputs)\n",
    "\n",
    "        # test: initialization\n",
    "        test_spk1, test_syn1, test_mem1 = net.lif1.init_stein(batch_size, num_hidden)\n",
    "        test_spk2, test_syn2, test_mem2 = net.lif2.init_stein(batch_size, num_outputs)\n",
    "\n",
    "        # training loop\n",
    "        step_counter = 0\n",
    "        for steps in range(num_steps):\n",
    "            syn1, mem1, spk1, syn2, mem2, spk2 = net(data_it.view(batch_size, -1), syn1, mem1, spk1, syn2, mem2)\n",
    "\n",
    "            # loss p/timestep --- can try truncated approach too\n",
    "            log_p_y = log_softmax_fn(mem2) # mem2 = 128 x 10\n",
    "            loss_val = loss_fn(log_p_y, targets_it) # targets_it = 128\n",
    "            loss_hist.append(loss_val.item())\n",
    "\n",
    "            # Gradient calculation - detach states so gradient can flow\n",
    "            optimizer.zero_grad()\n",
    "            loss_val.backward()\n",
    "\n",
    "            # Weight Update\n",
    "            # nn.utils.clip_grad_norm_(net.parameters(), 1) # gradient clipping\n",
    "            optimizer.step()\n",
    "\n",
    "            # Detach for next update - test which of these variables don't have to be detached\n",
    "            syn1.detach_()\n",
    "            mem1.detach_()\n",
    "            spk1.detach_()\n",
    "            syn2.detach_()\n",
    "            mem2.detach_()\n",
    "\n",
    "            # Test set forward pass\n",
    "            test_syn1, test_mem1, test_spk1, test_syn2, test_mem2, test_spk2  = net(testdata_it.view(batch_size, -1), test_syn1, test_mem1, test_spk1, test_syn2, test_mem2) ### WAY TOO MANY VARS\n",
    "\n",
    "            # Test set loss\n",
    "            log_p_ytest = log_softmax_fn(test_mem2)\n",
    "            loss_val_test = loss_fn(log_p_ytest, testtargets_it)\n",
    "            test_loss_hist.append(loss_val_test.item())\n",
    "\n",
    "\n",
    "            # Print test/train loss/accuracy\n",
    "            if step_counter == 24:\n",
    "                train_printer(syn1, mem1, spk1, syn2, mem2, test_syn1, test_mem1, test_spk1, test_syn2, test_mem2) ## THIS IS A JOKE\n",
    "            step_counter += 1\n",
    "            counter +=1\n",
    "\n",
    "        minibatch_counter += 1\n",
    "\n",
    "loss_hist_true_grad = loss_hist\n",
    "test_loss_hist_true_grad = test_loss_hist"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "## 4. Results\n",
    "### 4.1 Plot Training/Test Loss"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "outputs": [
    {
     "data": {
      "text/plain": "<Figure size 720x360 with 1 Axes>",
      "image/png": "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\n"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Plot Loss\n",
    "fig = plt.figure(facecolor=\"w\", figsize=(10, 5))\n",
    "plt.plot(loss_hist)\n",
    "plt.plot(test_loss_hist)\n",
    "plt.legend([\"Train Loss\", \"Test Loss\"])\n",
    "plt.xlabel(\"Epoch\")\n",
    "plt.ylabel(\"Loss\")\n",
    "plt.show()"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "### 4.2 Test Set Accuracy\n",
    "This function just iterates over all minibatches to obtain a measure of accuracy over the full 10,000 samples in the test set."
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "outputs": [],
   "source": [
    "total = 0\n",
    "correct = 0\n",
    "test_loader = DataLoader(mnist_test, batch_size=batch_size, shuffle=True, drop_last=False)\n",
    "\n",
    "with torch.no_grad():\n",
    "  net.eval()\n",
    "  for data in test_loader:\n",
    "    images, labels = data\n",
    "    images = images.to(device)\n",
    "    labels = labels.to(device)\n",
    "\n",
    "    # If current batch matches batch_size, just do the usual thing\n",
    "    if images.size()[0] == batch_size:\n",
    "      outputs, _ = net(images.view(batch_size, -1))\n",
    "\n",
    "    # If current batch does not match batch_size (e.g., is the final minibatch),\n",
    "    # modify batch_size in a temp variable and restore it at the end of the else block\n",
    "    else:\n",
    "      temp_bs = batch_size\n",
    "      batch_size = images.size()[0]\n",
    "      outputs, _ = net(images.view(images.size()[0], -1))\n",
    "      batch_size = temp_bs\n",
    "\n",
    "    _, predicted = outputs.sum(dim=0).max(1)\n",
    "    total += labels.size(0)\n",
    "    correct += (predicted == labels).sum().item()\n",
    "\n",
    "print(f\"Total correctly classified test set images: {correct}/{total}\")\n",
    "print(f\"Test Set Accuracy: {100 * correct / total}%\")"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "Voila! That's it for static MNIST."
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "## 5. Spiking MNIST\n",
    "Part of the appeal of SNNs is their ability to handle time-varying spiking data. So let's use rate-coding to convert MNIST into spiking MNIST using the `spikegen` module in the previous tutorial, and train our network with that instead."
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "outputs": [],
   "source": [
    "from snntorch import spikegen\n",
    "\n",
    "# MNIST to spiking-MNIST\n",
    "spike_data, spike_targets = spikegen.rate(data_it, targets_it, num_outputs=num_outputs, num_steps=num_steps, gain=1,\n",
    "                                          offset=0, convert_targets=False, temporal_targets=False)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "### 5.1 Visualiser\n",
    "Just so you're damn sure it's a spiking input."
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "source": [
    "!pip install celluloid # matplotlib animations made easy"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "execution_count": null,
   "outputs": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "outputs": [],
   "source": [
    "from celluloid import Camera\n",
    "from IPython.display import HTML\n",
    "\n",
    "# Animator\n",
    "spike_data_sample = spike_data[:, 0, 0].cpu()\n",
    "\n",
    "fig, ax = plt.subplots()\n",
    "camera = Camera(fig)\n",
    "plt.axis('off')\n",
    "\n",
    "for step in range(num_steps):\n",
    "    im = ax.imshow(spike_data_sample[step, :, :], cmap='plasma')\n",
    "    camera.snap()\n",
    "\n",
    "# interval=40 specifies 40ms delay between frames\n",
    "a = camera.animate(interval=40)\n",
    "HTML(a.to_html5_video())"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "outputs": [],
   "source": [
    "print(spike_targets[0])"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "## 6. Define Network\n",
    "The network is the same as before. The one difference is that the for-loop iterates through the first dimension of the input:\n",
    "`cur1 = self.fc1(x[step])`"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "outputs": [],
   "source": [
    "spike_grad = snn.FastSigmoidSurrogate.apply\n",
    "snn.slope = 50 # The lower the slope, the smoother the gradient\n",
    "\n",
    "# Define Network\n",
    "class Net(nn.Module):\n",
    "    def __init__(self):\n",
    "        super().__init__()\n",
    "\n",
    "        # Initialize layers\n",
    "        self.fc1 = nn.Linear(num_inputs, num_hidden)\n",
    "        self.lif1 = snn.Stein(alpha=alpha, beta=beta, spike_grad=spike_grad)\n",
    "        self.fc2 = nn.Linear(num_hidden, num_outputs)\n",
    "        self.lif2 = snn.Stein(alpha=alpha, beta=beta, spike_grad=spike_grad)\n",
    "\n",
    "    def forward(self, x):\n",
    "        # Initialize hidden states + output spike at t=0\n",
    "        spk1, syn1, mem1 = self.lif1.init_stein(batch_size, num_hidden)\n",
    "        spk2, syn2, mem2 = self.lif2.init_stein(batch_size, num_outputs)\n",
    "\n",
    "        spk2_rec = []\n",
    "        mem2_rec = []\n",
    "\n",
    "        for step in range(num_steps):\n",
    "            cur1 = self.fc1(x[step])\n",
    "            spk1, syn1, mem1 = self.lif1(cur1, syn1, mem1)\n",
    "            cur2 = self.fc2(spk1)\n",
    "            spk2, syn2, mem2 = self.lif2(cur2, syn2, mem2)\n",
    "\n",
    "            spk2_rec.append(spk2)\n",
    "            mem2_rec.append(mem2)\n",
    "\n",
    "        return torch.stack(spk2_rec, dim=0), torch.stack(mem2_rec, dim=0)\n",
    "\n",
    "net = Net().to(device)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "## 7. Training\n",
    "We make a slight modification to our print-out functions to handle the new first dimension of the input:"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "outputs": [],
   "source": [
    "def print_batch_accuracy(data, targets, train=False):\n",
    "    output, _ = net(data.view(num_steps, batch_size, -1))\n",
    "    _, idx = output.sum(dim=0).max(1)\n",
    "    acc = np.mean((targets == idx).detach().cpu().numpy())\n",
    "\n",
    "    if train:\n",
    "        print(f\"Train Set Accuracy: {acc}\")\n",
    "    else:\n",
    "        print(f\"Test Set Accuracy: {acc}\")\n",
    "\n",
    "def train_printer():\n",
    "    print(f\"Epoch {epoch}, Minibatch {minibatch_counter}\")\n",
    "    print(f\"Train Set Loss: {loss_hist[counter]}\")\n",
    "    print(f\"Test Set Loss: {test_loss_hist[counter]}\")\n",
    "    print_batch_accuracy(spike_data, spike_targets, train=True)\n",
    "    print_batch_accuracy(test_spike_data, test_spike_targets, train=False)\n",
    "    print(\"\\n\")\n"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "### 7.1 Optimizer & Loss\n",
    "We'll keep our optimizer and loss the exact same as the static MNIST case."
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "outputs": [],
   "source": [
    "optimizer = torch.optim.Adam(net.parameters(), lr=2e-4, betas=(0.9, 0.999))\n",
    "log_softmax_fn = nn.LogSoftmax(dim=-1)\n",
    "loss_fn = nn.NLLLoss()"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "### 7.2 Training Loop\n",
    "The training loop is identical to the static MNIST case, but we pass each minibatch through `spikegen.rate` before running it through the feedforward network."
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "outputs": [],
   "source": [
    "loss_hist = []\n",
    "test_loss_hist = []\n",
    "counter = 0\n",
    "\n",
    "# Outer training loop\n",
    "for epoch in range(3):\n",
    "    minibatch_counter = 0\n",
    "    data = iter(train_loader)\n",
    "\n",
    "    # Minibatch training loop\n",
    "    for data_it, targets_it in data:\n",
    "        data_it = data_it.to(device)\n",
    "        targets_it = targets_it.to(device)\n",
    "\n",
    "        # Spike generator\n",
    "        spike_data, spike_targets = spikegen.rate(data_it, targets_it, num_outputs=num_outputs, num_steps=num_steps,\n",
    "                                                  gain=1, offset=0, convert_targets=False, temporal_targets=False)\n",
    "\n",
    "        # Forward pass\n",
    "        output, mem_rec = net(spike_data.view(num_steps, batch_size, -1))\n",
    "        log_p_y = log_softmax_fn(mem_rec)\n",
    "        loss_val = torch.zeros((1), dtype=dtype, device=device)\n",
    "\n",
    "        # Sum loss over time steps to perform BPTT\n",
    "        for step in range(num_steps):\n",
    "          loss_val += loss_fn(log_p_y[step], targets_it)\n",
    "\n",
    "        # Gradient Calculation\n",
    "        optimizer.zero_grad()\n",
    "        loss_val.backward(retain_graph=True)\n",
    "        nn.utils.clip_grad_norm_(net.parameters(), 1)\n",
    "\n",
    "        # Weight Update\n",
    "        optimizer.step()\n",
    "\n",
    "        # Store Loss history\n",
    "        loss_hist.append(loss_val.item())\n",
    "\n",
    "        # Test set\n",
    "        test_data = itertools.cycle(test_loader)\n",
    "        testdata_it, testtargets_it = next(test_data)\n",
    "        testdata_it = testdata_it.to(device)\n",
    "        testtargets_it = testtargets_it.to(device)\n",
    "\n",
    "        # Test set spike conversion\n",
    "        test_spike_data, test_spike_targets = spikegen.rate(testdata_it, testtargets_it, num_outputs=num_outputs,\n",
    "                                                            num_steps=num_steps, gain=1, offset=0, convert_targets=False, temporal_targets=False)\n",
    "\n",
    "        # Test set forward pass\n",
    "        test_output, test_mem_rec = net(test_spike_data.view(num_steps, batch_size, -1))\n",
    "\n",
    "        # Test set loss\n",
    "        log_p_ytest = log_softmax_fn(test_mem_rec)\n",
    "        log_p_ytest = log_p_ytest.sum(dim=0)\n",
    "        loss_val_test = loss_fn(log_p_ytest, test_spike_targets)\n",
    "        test_loss_hist.append(loss_val_test.item())\n",
    "\n",
    "        # Print test/train loss/accuracy\n",
    "        if counter % 50 == 0:\n",
    "            train_printer()\n",
    "        minibatch_counter += 1\n",
    "        counter += 1\n",
    "\n",
    "loss_hist_true_grad = loss_hist\n",
    "test_loss_hist_true_grad = test_loss_hist"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "## 8. Spiking MNIST Results\n",
    "### 8.1 Plot Training/Test Loss"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "outputs": [],
   "source": [
    "# Plot Loss\n",
    "fig = plt.figure(facecolor=\"w\", figsize=(10, 5))\n",
    "plt.plot(loss_hist)\n",
    "plt.plot(test_loss_hist)\n",
    "plt.legend([\"Test Loss\", \"Train Loss\"])\n",
    "plt.xlabel(\"Epoch\")\n",
    "plt.ylabel(\"Loss\")\n",
    "plt.show()"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "### 8.2 Test Set Accuracy"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "outputs": [],
   "source": [
    "total = 0\n",
    "correct = 0\n",
    "test_loader = DataLoader(mnist_test, batch_size=batch_size, shuffle=True, drop_last=False)\n",
    "\n",
    "with torch.no_grad():\n",
    "  net.eval()\n",
    "  for data in test_loader:\n",
    "    images, labels = data\n",
    "    images = images.to(device)\n",
    "    labels = labels.to(device)\n",
    "\n",
    "    # If current batch matches batch_size, just do the usual thing\n",
    "    if images.size()[0] == batch_size:\n",
    "      spike_test, spike_targets = spikegen.rate(images, labels, num_outputs=num_outputs, num_steps=num_steps,\n",
    "                                                            gain=1, offset=0, convert_targets=False, temporal_targets=False)\n",
    "\n",
    "      outputs, _ = net(spike_test.view(num_steps, batch_size, -1))\n",
    "\n",
    "    # If current batch does not match batch_size (e.g., is the final minibatch),\n",
    "    # modify batch_size in a temp variable and restore it at the end of the else block\n",
    "    else:\n",
    "      temp_bs = batch_size\n",
    "      batch_size = images.size()[0]\n",
    "      spike_test, spike_targets = spikegen.rate(images, labels, num_outputs=num_outputs, num_steps=num_steps,\n",
    "                                                gain=1, offset=0, convert_targets=False, temporal_targets=False)\n",
    "\n",
    "      outputs, _ = net(spike_test.view(num_steps, images.size()[0], -1))\n",
    "      batch_size = temp_bs\n",
    "\n",
    "    _, predicted = outputs.sum(dim=0).max(1)\n",
    "    total += spike_targets.size(0)\n",
    "    correct += (predicted == spike_targets).sum().item()\n",
    "\n",
    "print(f\"Total correctly classified test set images: {correct}/{total}\")\n",
    "print(f\"Test Set Accuracy: {100 * correct / total}%\")"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "That's all for now!\n",
    "Next time, we'll introduce how to use spiking convolutional layers to improve accuracy."
   ],
   "metadata": {
    "collapsed": false
   }
  }
 ],
 "metadata": {
  "kernelspec": {
   "name": "python3",
   "language": "python",
   "display_name": "Python 3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
